/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.plan.manager;

import com.brain.conf.dto.MonedaDto;
import com.brain.conf.dto.TipoCambioDto;
import com.brain.conf.manager.TipoCambioManager;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.ParametroDto;
import com.brain.core.manager.*;
import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.plan.dto.AfpDetaDto;
import com.brain.plan.dto.CalculoDto;
import com.brain.plan.dto.ConceptoPlanillaDto;
import com.brain.plan.dto.PerTrabConDto;
import com.brain.plan.dto.PeriodoDto;
import com.brain.plan.view.util.ConstantesPlan;
import com.brain.sgc.dto.PersonaDto;
import com.brain.sgc.manager.PersonaManager;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * @author Greip Company
 * @since 09/01/2014
 * @version 1.0
 */
@Service
public class PeriodoManager extends ComunManager<PeriodoDto> implements Serializable {

    /**
     * Logger permite registrar los errores que ocurren
     * @since 09/01/2014
     */
    private static Logger logger = Logger.getLogger(PeriodoManager.class);
    
    /**
     * idEntidad utilizado para construir los títulos de los paneles de la entidad
     * @since 09/01/2014
     */
    private Long idEntidad = 278L;
    
    /**
     * applicationMBean permite obtener diferentes valores de la aplicación, como acciones y estilos
     * @since 09/01/2014
     */
    @Autowired
    private ApplicationMBean applicationMBean;
    
    /**
     * springHibernateDao usado para realizar las operaciones de listar, guardar, eliminar
     * @since 09/01/2014
     */
    @Resource
    private DAOGenerico<PeriodoDto> springHibernateDao;
    
    /**
     * recursosManager permite mostrar mensajes en las vistas
     * @since 09/01/2014
     */
    @Resource
    private RecursosManager recursosManager;
    
    /**
     * url dirección de la pagina periodo.xhtml
     * @since 09/01/2014
     */
    private final String url = "/pages/plan/periodo/periodo.xhtml";
    
    /**
     * urlLista dirección de la pagina listaPeriodo.xhtml
     * @since 09/01/2014
     */
    private final String urlLista = "/pages/plan/periodo/listaPeriodo.xhtml";
    
    /**
     * mensajeError: variable que almacena un mensaje de error
     * @since 10/01/2014
     */
    private String mensajeError;

    /**
     * Metodo que lista todos los dto (PeriodoDto)
     * @since 09/01/2014
     * @throws DAOException 
     * @return Lista de dto (PeriodoDto)
     */
    public List<PeriodoDto> obtenerTodos() throws DAOException {
        return springHibernateDao.listarTodosDtos(PeriodoDto.class);
    }

    /**
     * Metodo que lista todos los dto (PeriodoDto) usando filtros
     * @since 09/01/2014
     * @param filtros es el filtro utilizado en la búsqueda
     * @throws DAOException 
     * @return Lista de dto (PeriodoDto)
     */
    public List<PeriodoDto> obtenerConFiltro(Map<String, Object> filtros) throws DAOException {
        return springHibernateDao.obtenerDtosConFiltros(PeriodoDto.class, filtros);
    }

    /**
     * Metodo que lista todos los dto (PeriodoDto) usando filtros y un orden
     * @since 09/01/2014
     * @param filtros es el filtro utilizado en la búsqueda
     * @param orden orden usado en la búsqueda
     * @throws DAOException 
     * @return Lista de dto (PeriodoDto)
     */
    public List<PeriodoDto> obtenerConFiltroConOrden(Map<String, Object> filtros, Map<String, String> orden) throws DAOException {
        return springHibernateDao.obtenerDtosConFiltrosConOrden(PeriodoDto.class, filtros, orden);
    }

    /**
     * Metodo que permite obtener la entidad PeriodoDto usado el id como filtro
     * @since 09/01/2014
     * @param id usado para realizar la búsqueda de la entidad
     * @throws DAOException
     * @return entidad PeriodoDto
     */
    public PeriodoDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(PeriodoDto.class, id);
    }

    /**
     * Metodo que permite inicializar la entidad PeriodoDto
     * @since 09/01/2014
     * @return entidad PeriodoDto
     */
    public PeriodoDto inicializar() {

        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        Calendar c = Calendar.getInstance();
        c.setTime(UtilCore.Fecha.obtenerFechaActualDate());
        PeriodoDto dto = new PeriodoDto();
        dto.setEmpresaDto(sessionMBean.getEmpresaDto());
        dto.setEstado(ConstantesPlan.ValoresConstantes.PERIODO_COD_ESTADO_ABIERTO);
        dto.setAnio(UtilCore.Fecha.obtenerAnioActual());
        dto.setMes(UtilCore.Fecha.obtenerMesActual() + "");
        c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.getActualMinimum(Calendar.DAY_OF_MONTH));
        dto.setInicioPeriodo(c.getTime());
        c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.getActualMaximum(Calendar.DAY_OF_MONTH));
        dto.setFinPeriodo(c.getTime());
        dto.setDiasPeriodo(UtilCore.Fecha.diferenciaDiasFechas(dto.getInicioPeriodo(), dto.getFinPeriodo()));
        if (sessionMBean.getOrganizacionDto() != null) {
            if (sessionMBean.getOrganizacionDto().getId() != null) {
                dto.setOrganizacionDto(sessionMBean.getOrganizacionDto());
            }
        }
        return dto;
    }

    /**
     * obtenerMesTexto(): obtiene el mes en formato texto, tomando como parametro el mes en formato numerico
     * @since 10/01/2014
     * @param mes
     * @return retorna el valor en cadena del mes ingresado como número
     */
    public String obtenerMesTexto(int mes) {
        String[] meses = {
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.enero"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.enero"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.febrero"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.marzo"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.abril"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.mayo"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.junio"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.julio"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.agosto"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.setiembre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.octubre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.noviembre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.diciembre")
        };
        return meses[mes];
    }

    /**
     * obtenerPeriodosActivos(): obtiene un listado con los periodos activos
     * @since 10/01/2014
     * @param sqr
     * @return retorna un listado de la entidad PeriodoDto
     * @throws DAOException 
     */
    public List<PeriodoDto> obtenerPeriodosActivos(final String sqr) throws DAOException {
        String query = "select e from PeriodoDto as e ";
        List<Object> listaParametros = new ArrayList<Object>();
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        query += " where e.organizacionDto.id = ?";
        listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        query += " and (e.anio like '" + sqr + "%')";
        //query += " or e.mes like '"+ sqr +"%')";
        query += " and e.estado  = '" + ConstantesPlan.ValoresConstantes.PERIODO_COD_ESTADO_ABIERTO + "'";
        query += " order by e.anio, e.mes desc";

        return springHibernateDao.ejecutarQuery(query, listaParametros);
    }

    /**
     * Metodo que obtiene un listado de la entidad PeriodoDto, tomando como parametro a la entidad PeriodoDto
     * @since 09/01/2014
     * @param dto entidad usada para realizar la búsqueda
     * @throws DAOException
     * @return listado de la entidad PeriodoDto
     */ 
    public List<PeriodoDto> obtenerPeriodos(PeriodoDto dto) throws DAOException {
        String query = "select e from PeriodoDto as e where e.organizacionDto.id = ?";
        List<Object> listaParametros = new ArrayList<Object>();
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        if (dto.getId() != null && !dto.getId().equals(0L)) {
            query += " and e.id = ?";
            listaParametros.add(dto.getId());
        } else {
            if (dto.getMes() != null && dto.getMes().length() != 0 && dto.getMes().equals("*")) {
                query += " and e.mes = '" + dto.getMes() + "'";
            }

            if (dto.getEstado() != null && dto.getEstado().length() != 0 && !dto.getEstado().equals(ConstantesPlan.ValoresConstantes.PERIODO_COD_ESTADO_TODOS)) {
                query += " and e.estado = '" + dto.getEstado() + "'";
            }
        }
        query += " order by e.anio, e.mes desc";

        return springHibernateDao.ejecutarQuery(query, listaParametros);
    }

    /**
     * obtenerCantPeriodosPorOrgAnioMes(): obtiene la cantidad de periodos por organización, año y mes
     * @since 10/01/2014
     * @param dto
     * @return retorna un entero que indica la cantidad de registros
     * @throws DAOException 
     */
    public Integer obtenerCantPeriodosPorOrgAnioMes(PeriodoDto dto) throws DAOException {
        String query = "select count(e.id) from PeriodoDto as e where e.organizacionDto.id = ?";
        List<Object> listaParametros = new ArrayList<Object>();
        listaParametros.add(dto.getOrganizacionDto().getId());
        query += " and e.anio = ? ";
        listaParametros.add(dto.getAnio());
        query += " and e.mes = '" + dto.getMes() + "'";
        return Integer.parseInt(springHibernateDao.ejecutarQueryGeneric(query, listaParametros).get(0).toString());
    }

    /**
     * Metodo que permite guardar la entidad PeriodoDto
     * @since 09/01/2014
     * @param dto entidad a guardar
     * @return retorna una cadena, que indica la página a mostrarse después de guardar la entidad
     */
    @Transactional(rollbackFor = Exception.class)
    public String guardar(PeriodoDto dto) {
        String ir = "";
        String mensajeTrx = "";
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        ConceptoPlanillaManager conceptoPlaniManager = (ConceptoPlanillaManager) WebServletContextListener.getApplicationContext().getBean("conceptoPlanillaManager");
        PerTrabConManager perTrabConManager = (PerTrabConManager) WebServletContextListener.getApplicationContext().getBean("perTrabConManager");
        AfpDetaManager afpDetaManager = (AfpDetaManager) WebServletContextListener.getApplicationContext().getBean("afpDetaManager");
        ParametroManager parametroManager = (ParametroManager) WebServletContextListener.getApplicationContext().getBean("parametroManager");

        dto.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
        dto.setTerminal(sessionMBean.getSessionTerminal());
        dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
        try {
            if (validarDatosPeriodo(dto)) {
                if (sessionMBean.getAccion() == applicationMBean.getNuevo()) {
                    dto.setUsuarioCreacionDto(sessionMBean.getSessionUsuarioDto());
                    dto.setTerminalCreacion(sessionMBean.getSessionTerminal());
                    dto.setFechaCreacion(UtilCore.Fecha.obtenerFechaActualDate());
                    UtilCore.General.toUpperCaseDto(dto);
                    //Generamos los registros de la tabla PER-TRAB-CON
                    ConceptoPlanillaDto dtoConcFiltro = new ConceptoPlanillaDto();
                    dtoConcFiltro.setEstado(Boolean.TRUE);
                    List<PersonaDto> listaEmpleados = this.obtenerEmpleadosPorPeriodo();
                    List<ConceptoPlanillaDto> listaConceptos = conceptoPlaniManager.obtenerConceptosPlanilla(dtoConcFiltro);
                    List<PerTrabConDto> lstPerTrabCon = new ArrayList<PerTrabConDto>();
                    if (listaConceptos != null && listaEmpleados != null && !listaConceptos.isEmpty() && !listaEmpleados.isEmpty()) {
                        boolean indicador = true;
                        PerTrabConDto objPerTrabCon = null;
                        AfpDetaDto objAfpDeta = null;
                        //Obtenemos el porcentaje de ONP
                        ParametroDto parametroONPDto = parametroManager.obtenerPorId(ConstantesPlan.Parametro.REG_PENS_ONP);
                        ParametroDto parametroEsSaludDto = parametroManager.obtenerPorId(ConstantesPlan.Parametro.ES_SALUD);
                        TipoCambioDto tcDto = null;
                        BigDecimal porcFondoAfp = BigDecimal.ZERO;
                        BigDecimal montFondoAfp = BigDecimal.ZERO;
                        BigDecimal porcComisionFAfp = BigDecimal.ZERO;
                        BigDecimal montComisionFAfp = BigDecimal.ZERO;
                        BigDecimal porcComisionSAfp = BigDecimal.ZERO;
                        BigDecimal montComisionSAfp = BigDecimal.ZERO;
                        BigDecimal porcSeguroAfp = BigDecimal.ZERO;
                        BigDecimal montoSeguroAfp = BigDecimal.ZERO;
                        BigDecimal aporteTotalAfp = BigDecimal.ZERO;
                        if (parametroONPDto != null) {
                            if (parametroEsSaludDto != null) {
                                for (PersonaDto p : listaEmpleados) {
                                    if (p.getRegimen().equals(ConstantesPlan.ValoresConstantes.REGIMEN_PENSIONARIO_AFP)) {
                                        if (p.getAfpDto().getValoresConstantes().equals(ConstantesPlan.ValoresConstantes.AFP_POR_MES)) {
                                            objAfpDeta = afpDetaManager.obtenerPorcentajesPorAnioMes(dto.getAnio(), obtenerMesTexto(Integer.parseInt(dto.getMes())), p.getAfpDto());
                                            if (objAfpDeta == null) {
                                                indicador = false;
                                                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("periodo.mensaje.6", p.getAfpDto().getDescripcion());
                                                recursosManager.showError(mensajeTrx);
                                                ir = null;
                                                break;
                                            } else {
                                                porcFondoAfp = objAfpDeta.getPorcentajeFondo();
                                                montFondoAfp = UtilCore.Numero.dividir(p.getContVigenteDto().getRemBasica(), new BigDecimal(100), applicationMBean.getPrecisionDecimales()).multiply(porcFondoAfp);
                                                porcSeguroAfp = objAfpDeta.getPorcentajeSeguro();
                                                montoSeguroAfp = UtilCore.Numero.dividir(p.getContVigenteDto().getRemBasica(), new BigDecimal(100), applicationMBean.getPrecisionDecimales()).multiply(porcSeguroAfp);
                                                if (p.getTipoComision().equals(ConstantesPlan.ValoresConstantes.TIPO_COMISION_FLUJO_COD)) {
                                                    porcComisionFAfp = objAfpDeta.getComisionFlujo();
                                                    montComisionFAfp = UtilCore.Numero.dividir(p.getContVigenteDto().getRemBasica(), new BigDecimal(100), applicationMBean.getPrecisionDecimales()).multiply(porcComisionFAfp);
                                                } else if (p.getTipoComision().equals(ConstantesPlan.ValoresConstantes.TIPO_COMISION_SALDO_COD)) {
                                                    porcComisionFAfp = objAfpDeta.getComisionMixta();
                                                    montComisionFAfp = UtilCore.Numero.dividir(p.getContVigenteDto().getRemBasica(), new BigDecimal(100), applicationMBean.getPrecisionDecimales()).multiply(porcComisionFAfp);
                                                    porcComisionSAfp = objAfpDeta.getComisionSaldo();
                                                    montComisionSAfp = UtilCore.Numero.dividir(p.getContVigenteDto().getRemBasica(), new BigDecimal(100), applicationMBean.getPrecisionDecimales()).multiply(porcComisionSAfp);
                                                }
                                            }
                                        } else if (p.getAfpDto().getValoresConstantes().equals(ConstantesPlan.ValoresConstantes.AFP_POR_CONST)) {
                                            porcFondoAfp = p.getAfpDto().getPorcentajeFondo();
                                            montFondoAfp = UtilCore.Numero.dividir(p.getContVigenteDto().getRemBasica(), new BigDecimal(100), applicationMBean.getPrecisionDecimales()).multiply(porcFondoAfp);
                                            porcSeguroAfp = p.getAfpDto().getPorcentajeSeguro();
                                            montoSeguroAfp = UtilCore.Numero.dividir(p.getContVigenteDto().getRemBasica(), new BigDecimal(100), applicationMBean.getPrecisionDecimales()).multiply(porcSeguroAfp);
                                            if (p.getTipoComision().equals(ConstantesPlan.ValoresConstantes.TIPO_COMISION_FLUJO_COD)) {
                                                porcComisionFAfp = p.getAfpDto().getComisionFlujo();
                                                montComisionFAfp = UtilCore.Numero.dividir(p.getContVigenteDto().getRemBasica(), new BigDecimal(100), applicationMBean.getPrecisionDecimales()).multiply(porcComisionFAfp);
                                            } else if (p.getTipoComision().equals(ConstantesPlan.ValoresConstantes.TIPO_COMISION_SALDO_COD)) {
                                                porcComisionFAfp = p.getAfpDto().getComisionMixta();
                                                montComisionFAfp = UtilCore.Numero.dividir(p.getContVigenteDto().getRemBasica(), new BigDecimal(100), applicationMBean.getPrecisionDecimales()).multiply(porcComisionFAfp);
                                                porcComisionSAfp = p.getAfpDto().getComisionSaldo();
                                                montComisionSAfp = UtilCore.Numero.dividir(p.getContVigenteDto().getRemBasica(), new BigDecimal(100), applicationMBean.getPrecisionDecimales()).multiply(porcComisionSAfp);
                                            }
                                        }

                                        aporteTotalAfp = aporteTotalAfp.add(montFondoAfp);
                                        aporteTotalAfp = aporteTotalAfp.add(montoSeguroAfp);
                                        aporteTotalAfp = aporteTotalAfp.add(montComisionFAfp);
                                        //aporteTotalAfp = aporteTotalAfp.add(montComisionSAfp);
                                    }
                                    for (ConceptoPlanillaDto c : listaConceptos) {
                                        objPerTrabCon = new PerTrabConDto();
                                        objPerTrabCon.setEmpleadoDto(p);
                                        objPerTrabCon.setConceptoPlanillaDto(c);
                                        objPerTrabCon.setValor(BigDecimal.ZERO);
                                        //Precargamos el valor de los conceptos propios del empleado
                                        if (c.getId().equals(ConstantesPlan.ValoresConstantes.DIAS_PER)) {
                                            objPerTrabCon.setValor(new BigDecimal(dto.getDiasPeriodo()));
                                        } else if (c.getId().equals(ConstantesPlan.ValoresConstantes.HABER_BAS)) {
                                            objPerTrabCon.setValor(p.getContVigenteDto().getRemBasica());
                                        } else if (c.getId().equals(ConstantesPlan.ValoresConstantes.AS_FAM)) {
                                            objPerTrabCon.setValor(p.getContVigenteDto().getPuestoDto().getAsignacionFamiliar());
                                        } else if (c.getId().equals(ConstantesPlan.ValoresConstantes.AFP_FONP)) {
                                            objPerTrabCon.setValor(porcFondoAfp);
                                        } else if (c.getId().equals(ConstantesPlan.ValoresConstantes.AFP_COMFP)) {
                                            objPerTrabCon.setValor(porcComisionFAfp);
                                        } else if (c.getId().equals(ConstantesPlan.ValoresConstantes.AFP_COMSP)) {
                                            objPerTrabCon.setValor(porcComisionSAfp);
                                        } else if (c.getId().equals(ConstantesPlan.ValoresConstantes.AFP_SEGP)) {
                                            objPerTrabCon.setValor(porcSeguroAfp);
                                        } else if (c.getId().equals(ConstantesPlan.ValoresConstantes.AFP_FON)) {
                                            objPerTrabCon.setValor(montFondoAfp);
                                        } else if (c.getId().equals(ConstantesPlan.ValoresConstantes.AFP_COMF)) {
                                            objPerTrabCon.setValor(montComisionFAfp);
                                        } else if (c.getId().equals(ConstantesPlan.ValoresConstantes.AFP_COMS)) {
                                            objPerTrabCon.setValor(montComisionSAfp);
                                        } else if (c.getId().equals(ConstantesPlan.ValoresConstantes.AFP_SEG)) {
                                            objPerTrabCon.setValor(montoSeguroAfp);
                                        } else if (c.getId().equals(ConstantesPlan.ValoresConstantes.TOT_APOAFP)) {
                                            objPerTrabCon.setValor(aporteTotalAfp);
                                        } else if (c.getId().equals(ConstantesPlan.ValoresConstantes.ONP_P)) {
                                            if (p.getRegimen().equals(ConstantesPlan.ValoresConstantes.REGIMEN_PENSIONARIO_ONP)) {
                                                objPerTrabCon.setValor(parametroONPDto.getValorReal());
                                            }
                                        } else if (c.getId().equals(ConstantesPlan.ValoresConstantes.ONP)) {
                                            if (p.getRegimen().equals(ConstantesPlan.ValoresConstantes.REGIMEN_PENSIONARIO_ONP)) {
                                                objPerTrabCon.setValor(UtilCore.Numero.dividir(p.getContVigenteDto().getRemBasica(), new BigDecimal(100), applicationMBean.getPrecisionDecimales()).multiply(parametroONPDto.getValorReal()));
                                            }
                                        } else if (c.getId().equals(ConstantesPlan.ValoresConstantes.ESSALUD)) {
                                            objPerTrabCon.setValor(UtilCore.Numero.dividir(p.getContVigenteDto().getRemBasica(), new BigDecimal(100), applicationMBean.getPrecisionDecimales()).multiply(parametroEsSaludDto.getValorReal()));
                                        } else if (c.getId().equals(ConstantesPlan.ValoresConstantes.TCAMBIO)) {
                                            //Obtenemos el tipo de cambio en caso fuera necesario
                                            tcDto = verificarMonedas(sessionMBean.getOrganizacionDto().getMonedaDto(), p.getTipoMonedaDto());
                                            if (tcDto == null) {
                                                indicador = false;
                                                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("periodo.mensaje.7", p.getTipoMonedaDto().getDescripcion(), p.getNombreCompleto());
                                                recursosManager.showError(mensajeTrx);
                                                ir = null;
                                                break;
                                            } else if (!tcDto.getId().equals(-1L)) {
                                                objPerTrabCon.setValor(tcDto.getFactor());
                                            } else if (tcDto.getId().equals(-1L)) {
                                                objPerTrabCon.setValor(BigDecimal.ONE);
                                            }
                                        }
                                        lstPerTrabCon.add(objPerTrabCon);
                                    }
                                }
                                //Realizamos el grabado de los datos
                                if (indicador) {
                                    nuevo(dto);
                                    //Guardamos la lista
                                    for (PerTrabConDto pertrab : lstPerTrabCon) {
                                        pertrab.setPeriodoDto(dto);
                                    }
                                    perTrabConManager.nuevoMuchos(lstPerTrabCon);
                                    mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                                    recursosManager.showMessage(mensajeTrx);
                                    ir = "";
                                }
                            } else {
                                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("periodo.mensaje.9");
                                recursosManager.showError(mensajeTrx);
                                ir = null;
                            }
                        } else {
                            mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("periodo.mensaje.5");
                            recursosManager.showError(mensajeTrx);
                            ir = null;
                        }
                    } else {
                        mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("periodo.mensaje.4");
                        recursosManager.showError(mensajeTrx);
                        ir = null;
                    }
                }
            } else {
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("periodo.mensaje.1");
                recursosManager.showError(mensajeTrx);
                ir = null;
            }
        } catch (Exception ex) {
            logger.error(ex.getMessage());
            ir = null;
            System.out.println("ERROR : " + ex.getMessage());
            recursosManager.showError(mensajeTrx);
        }
        return ir;
    }

    /**
     * verificarMonedas(): verifica las monedas, tomando como parametro la moneda de entrada y moneda de salida
     * @since 10/01/2014
     * @param entrada
     * @param salida
     * @return retorna la entidad TipoCambioDto
     */
    public TipoCambioDto verificarMonedas(MonedaDto entrada, MonedaDto salida) {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        TipoCambioManager tipoCambioManager = (TipoCambioManager) WebServletContextListener.getApplicationContext().getBean("tipoCambioManager");
        TipoCambioDto tcDto = null;
        //Verificamos si es necesario usar el tipo de cambio
        if (!entrada.equals(salida)) {
            tcDto = tipoCambioManager.obtenerFactorConversionProceso(entrada, salida, sessionMBean.getOrganizacionDto().getTcCompra(), 1);
            if (tcDto.getId() == null) {
                return null;
            }
        } else {
            tcDto = new TipoCambioDto(-1L);
        }
        return tcDto;
    }

    /**
     * cerrarPeriodo(): método encargado de cerrar un periodo. Actualiza la entidad
     * @since 10/01/2014
     * @param dto 
     */
    public void cerrarPeriodo(PeriodoDto dto) {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        try {
            //Verificamos si este periodo ya ha sido calculado
            CalculoManager calculoManager = (CalculoManager) WebServletContextListener.getApplicationContext().getBean("calculoManager");
            CalculoDto cDto = new CalculoDto();
            cDto.setPeriodoDto(dto);
            if (calculoManager.obtenerCantCalculosPorPeriodo(cDto) <= 0) {
                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("periodo.mensaje.8"));
            } else {
                dto.setFechaCierre(UtilCore.Fecha.obtenerFechaActualDate());
                dto.setUsuarioCierreDto(sessionMBean.getSessionUsuarioDto());
                dto.setEstado(ConstantesPlan.ValoresConstantes.PERIODO_COD_ESTADO_CERRADO);
                editar(dto);
                recursosManager.showMessage(UtilCore.Internacionalizacion.getMensajeInternacional("periodo.mensaje.10"));
            }

        } catch (DAOException ex) {
            logger.error(ex);
            recursosManager.showError(ex.getMessage());
        }
    }

    /**
     * guardarValores(): dada una lista de la entidad PerTrabConDto, se encarga de guardar dicho listado
     * @since 10/01/2014
     * @param lista 
     */
    public void guardarValores(List<PerTrabConDto> lista) {
        try {
            PerTrabConManager perTrabConManager = (PerTrabConManager) WebServletContextListener.getApplicationContext().getBean("perTrabConManager");
            perTrabConManager.nuevoMuchos(lista);
            recursosManager.showMessage(UtilCore.Internacionalizacion.getMensajeInternacional("periodo.popup.mensaje.exito"));
        } catch (DAOException ex) {
            logger.error(ex.getMessage());
            recursosManager.showError(ex.getMessage());
        }
    }

    /**
     * validarDatosPeriodo(): valida los datos del periodo pasado como parametro
     * @since 10/01/2014
     * @param dto
     * @return retorna true o false dependiendo de la validación
     */
    public boolean validarDatosPeriodo(PeriodoDto dto) {
        try {
            if (obtenerCantPeriodosPorOrgAnioMes(dto) > 0) {
                return false;
            }
        } catch (DAOException ex) {
            logger.error(ex.getMessage());
            recursosManager.showError(ex.getMessage());
        }
        return true;
    }

    /**
     * obtenerMontoPorMinutoLaborado(): obtiene el monto por minuto laborado, tomando el id del periodo, el id del empleado y el haber basico como parametros
     * @since 10/01/2014
     * @param idPeriodo
     * @param idEmpleado
     * @param haberBasico
     * @return retorna un valor decimal
     */
    public BigDecimal obtenerMontoPorMinutoLaborado(Long idPeriodo, Long idEmpleado, BigDecimal haberBasico) {
        BigDecimal monto = BigDecimal.ZERO;
        try {
            PerTrabConManager perTrabConManager = (PerTrabConManager) WebServletContextListener.getApplicationContext().getBean("perTrabConManager");
            PerTrabConDto objComun = perTrabConManager.obtenerConceptoPorPerYEmp(idPeriodo, idEmpleado, ConstantesPlan.ValoresConstantes.DIAS_PER);
            monto = UtilCore.Numero.dividir(haberBasico, objComun.getValor().multiply(new BigDecimal("840")), applicationMBean.getPrecisionDecimales());
        } catch (DAOException ex) {
            logger.error(ex);
            recursosManager.showError(ex.getMessage());
        }
        return monto;
    }

    /**
     * obtenerMontoPorHoraLaborada(): obtiene el monto por hora laborada, tomando el id del periodo, el id del empleado y el haber basico como parametros
     * @since 10/01/2014
     * @param idPeriodo
     * @param idEmpleado
     * @param haberBasico
     * @return retorna un valor decimal
     */
    public BigDecimal obtenerMontoPorHoraLaborada(Long idPeriodo, Long idEmpleado, BigDecimal haberBasico) {
        BigDecimal monto = BigDecimal.ZERO;
        try {
            PerTrabConManager perTrabConManager = (PerTrabConManager) WebServletContextListener.getApplicationContext().getBean("perTrabConManager");
            PerTrabConDto objComun = perTrabConManager.obtenerConceptoPorPerYEmp(idPeriodo, idEmpleado, ConstantesPlan.ValoresConstantes.DIAS_PER);
            monto = UtilCore.Numero.dividir(haberBasico, objComun.getValor().multiply(new BigDecimal("8")), applicationMBean.getPrecisionDecimales());
        } catch (DAOException ex) {
            logger.error(ex);
            recursosManager.showError(ex.getMessage());
        }
        return monto;
    }

    /**
     * obtenerMontoPorDiaLaborado(): obtiene el monto por dia laborado, tomando como parametro el id del periodo, el id del empleado y el haber basico
     * @since 10/01/2014
     * @param idPeriodo
     * @param idEmpleado
     * @param haberBasico
     * @return retorna un valor decimal
     */
    public BigDecimal obtenerMontoPorDiaLaborado(Long idPeriodo, Long idEmpleado, BigDecimal haberBasico) {
        BigDecimal monto = BigDecimal.ZERO;
        try {
            PerTrabConManager perTrabConManager = (PerTrabConManager) WebServletContextListener.getApplicationContext().getBean("perTrabConManager");
            PerTrabConDto objComun = perTrabConManager.obtenerConceptoPorPerYEmp(idPeriodo, idEmpleado, ConstantesPlan.ValoresConstantes.DIAS_PER);
            monto = UtilCore.Numero.dividir(haberBasico, objComun.getValor(), applicationMBean.getPrecisionDecimales());
        } catch (DAOException ex) {
            logger.error(ex);
            recursosManager.showError(ex.getMessage());
        }
        return monto;
    }

    /**
     * obtenerEmpleadosPorPeriodo(): obtiene un listado de la entidad PersonaDto por periodo
     * @since 10/01/2014
     * @return 
     */
    public List<PersonaDto> obtenerEmpleadosPorPeriodo() {
        List<PersonaDto> lst = null;
        try {
            PersonaManager personaManager = (PersonaManager) WebServletContextListener.getApplicationContext().getBean("personaManager");
            lst = personaManager.obtenerEmpleadosSinFiltro();
        } catch (DAOException ex) {
            logger.error(ex.getMessage());
            recursosManager.showError(ex.getMessage());
        }
        return lst;
    }

    /**
     * obtenerConceptosPorEmpYPerListado(): obtiene un listado de la entidad PerTrabConDto tomando como parametro el id del empleado y el id del periodo
     * @since 10/01/2014
     * @param idPersona
     * @param idPeriodo
     * @return retorna un listado de la entidad PerTrabConDto
     */
    public List<PerTrabConDto> obtenerConceptosPorEmpYPerListado(Long idPersona, Long idPeriodo) {
        List<PerTrabConDto> lst = null;
        try {
            PerTrabConManager perTrabConManager= (PerTrabConManager) WebServletContextListener.getApplicationContext().getBean("perTrabConManager");
            lst = perTrabConManager.obtenerConceptosPorEmpYPeriodoListado(idPersona, idPeriodo);
        } catch (DAOException ex) {
            logger.error(ex.getMessage());
            recursosManager.showError(ex.getMessage());
        }
        return lst;
    }
    
    /**
     * obtenerConceptosPorEmpYPer(): obtiene un listado de la entidad PerTrabConDto tomando como parametro el id de la persona y el id del periodo
     * @since 10/01/2014
     * @param idPersona
     * @param idPeriodo
     * @return 
     */
    public List<PerTrabConDto> obtenerConceptosPorEmpYPer(Long idPersona, Long idPeriodo) {
        List<PerTrabConDto> lst = null;
        try {
            PerTrabConManager perTrabConManager = (PerTrabConManager) WebServletContextListener.getApplicationContext().getBean("perTrabConManager");
            lst = perTrabConManager.obtenerConceptosPorEmpYPeriodo(idPersona, idPeriodo);
        } catch (DAOException ex) {
            logger.error(ex.getMessage());
            recursosManager.showError(ex.getMessage());
        }
        return lst;
    }

    /**
     * siListaMesesTodos(): crea un combo de meses incluyendo el * que representa a todos
     * @since 10/01/2014
     * @return retorna un combo de meses
     */
    public SelectItem[] siListaMesesTodos() {
        SelectItem[] si = new SelectItem[13];
        si[0] = new SelectItem("0", "*");
        si[1] = new SelectItem("1", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.enero"));
        si[2] = new SelectItem("2", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.febrero"));
        si[3] = new SelectItem("3", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.marzo"));
        si[4] = new SelectItem("4", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.abril"));
        si[5] = new SelectItem("5", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.mayo"));
        si[6] = new SelectItem("6", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.junio"));
        si[7] = new SelectItem("7", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.julio"));
        si[8] = new SelectItem("8", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.agosto"));
        si[9] = new SelectItem("9", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.setiembre"));
        si[10] = new SelectItem("10", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.octubre"));
        si[11] = new SelectItem("11", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.noviembre"));
        si[12] = new SelectItem("12", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.diciembre"));

        return si;
    }

    /**
     * siListaMeses(): crea un combo de meses
     * @since 10/01/2014
     * @return retorna un combo de meses
     */
    public SelectItem[] siListaMeses() {
        SelectItem[] si = new SelectItem[12];
        si[0] = new SelectItem("1", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.enero"));
        si[1] = new SelectItem("2", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.febrero"));
        si[2] = new SelectItem("3", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.marzo"));
        si[3] = new SelectItem("4", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.abril"));
        si[4] = new SelectItem("5", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.mayo"));
        si[5] = new SelectItem("6", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.junio"));
        si[6] = new SelectItem("7", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.julio"));
        si[7] = new SelectItem("8", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.agosto"));
        si[8] = new SelectItem("9", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.setiembre"));
        si[9] = new SelectItem("10", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.octubre"));
        si[10] = new SelectItem("11", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.noviembre"));
        si[11] = new SelectItem("12", UtilCore.Internacionalizacion.getMensajeInternacional("general.label.diciembre"));

        return si;
    }

    /**
     * obtenerListaEstados(): crea un combo de estados, los cuales son TODOS, ABIERTO y CERRADO
     * @since 10/01/2014
     * @return retorna un combo de estados
     */
    public SelectItem[] obtenerListaEstados() {
        SelectItem[] si = new SelectItem[3];
        si[0] = new SelectItem(ConstantesPlan.ValoresConstantes.PERIODO_COD_ESTADO_TODOS, ConstantesPlan.ValoresConstantes.PERIODO_DESC_ESTADO_TODOS);
        si[1] = new SelectItem(ConstantesPlan.ValoresConstantes.PERIODO_COD_ESTADO_ABIERTO, ConstantesPlan.ValoresConstantes.PERIODO_DESC_ESTADO_ABIERTO);
        si[2] = new SelectItem(ConstantesPlan.ValoresConstantes.PERIODO_COD_ESTADO_CERRADO, ConstantesPlan.ValoresConstantes.PERIODO_DESC_ESTADO_CERRADO);
        return si;
    }

    public String getUrl() {
        return url;
    }

    public String getUrlLista() {
        return urlLista;
    }

    public Long getIdEntidad() {
        return idEntidad;
    }

    public void setIdEntidad(Long idEntidad) {
        this.idEntidad = idEntidad;
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        PeriodoManager.logger = logger;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public DAOGenerico<PeriodoDto> getSpringHibernateDao() {
        return springHibernateDao;
    }

    public void setSpringHibernateDao(DAOGenerico<PeriodoDto> springHibernateDao) {
        this.springHibernateDao = springHibernateDao;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public String getMensajeError() {
        return mensajeError;
    }

    public void setMensajeError(String mensajeError) {
        this.mensajeError = mensajeError;
    }
}